DepositData.tsx 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. "use client";
  2. import { DepositsTypes } from "@/api/depositsApi";
  3. import { getUserRechargeApi } from "@/api/user";
  4. import Box from "@/components/Box";
  5. import ButtonOwn from "@/components/ButtonOwn";
  6. import { useUserInfoStore } from "@/stores/useUserInfoStore";
  7. import { neReg } from "@/utils";
  8. import { Form, Input, Toast } from "antd-mobile";
  9. import { FormInstance } from "antd-mobile/es/components/form";
  10. import { useTranslations } from "next-intl";
  11. import { FC, Fragment, useRef, useState } from "react";
  12. import "@/styles/deposit.scss";
  13. interface Props {
  14. deposits: DepositsTypes[];
  15. }
  16. const DepositData: FC<Props> = (props) => {
  17. const { deposits } = props;
  18. const t = useTranslations();
  19. const userInfo = useUserInfoStore((state) => state.userInfo);
  20. const [activeType, setActiveType] = useState<DepositsTypes>(deposits[0]);
  21. const formInstanceRef = useRef<FormInstance>(null);
  22. let [amount, setAmount] = useState<number | undefined>(undefined);
  23. const titleChangeHandler = (item: DepositsTypes, index: number) => {
  24. setAmount(undefined);
  25. setActiveType(item);
  26. formInstanceRef.current?.resetFields();
  27. };
  28. const isStrictMode = true;
  29. const onFinish = (values: any) => {
  30. const params = { ...values, channel_id: activeType.id, amount: +values.amount };
  31. getUserRechargeApi(params)
  32. .then((res) => {
  33. formInstanceRef.current?.resetFields();
  34. Toast.show({ icon: "success", content: t("code.200"), maskClickable: false });
  35. setAmount(undefined);
  36. if (res.data.pay_url) {
  37. window.open(res.data.pay_url);
  38. }
  39. })
  40. .catch((error) => {
  41. Toast.show({ content: t(`code${error.data.code}`), maskClickable: false });
  42. });
  43. };
  44. const onValuesChange = (changeValues: any) => {
  45. if (changeValues.amount) {
  46. setAmount(changeValues.amount);
  47. }
  48. };
  49. const amountChange = (value: number) => {
  50. formInstanceRef.current?.setFieldValue("amount", value);
  51. setAmount(value);
  52. };
  53. const amountValidator = (rules: any, value: any) => {
  54. if (!value) return Promise.reject(new Error(t("form.amount")));
  55. if (+value < activeType.min_amount)
  56. return Promise.reject(
  57. new Error(t("form.amountMinReg", { amount: activeType.min_amount }))
  58. );
  59. if (+value > activeType.max_amount)
  60. return Promise.reject(
  61. new Error(t("form.amountMaxReg", { amount: activeType.max_amount }))
  62. );
  63. return Promise.resolve();
  64. };
  65. return (
  66. <div className="deposit-box">
  67. <div className={"flex flex-wrap"}>
  68. {deposits.map((item, index) => {
  69. return (
  70. <Fragment key={item.id}>
  71. <p
  72. className="btn-box truncate"
  73. style={{
  74. borderColor: activeType.id === item.id ? "#ff9323" : "#333",
  75. }}
  76. onClick={() => titleChangeHandler(item, index)}
  77. >
  78. {item.name}
  79. </p>
  80. </Fragment>
  81. );
  82. })}
  83. </div>
  84. <Box className={"custom-form"} style={{ padding: 0 }}>
  85. <Form
  86. style={{
  87. "--border-bottom": "none",
  88. "--border-top": "none",
  89. "--border-inner": "none",
  90. }}
  91. ref={formInstanceRef}
  92. footer={
  93. <>
  94. <ButtonOwn active>{t("DepositPage.DepositarAgora")}</ButtonOwn>
  95. </>
  96. }
  97. initialValues={userInfo}
  98. onFinish={onFinish}
  99. onValuesChange={onValuesChange}
  100. >
  101. {isStrictMode ? (
  102. <>
  103. <Form.Item
  104. name="user_name"
  105. label=""
  106. rules={[{ required: true, message: t("form.usernameReg") }]}
  107. >
  108. <Input placeholder={t("form.username")} />
  109. </Form.Item>
  110. <Form.Item
  111. name="passport"
  112. label=""
  113. rules={[
  114. { required: true, message: t("form.cardReg"), pattern: neReg },
  115. ]}
  116. >
  117. <Input placeholder={t("form.card")} maxLength={11} type={"text"} />
  118. </Form.Item>
  119. </>
  120. ) : null}
  121. <Form.Item
  122. name="amount"
  123. label=""
  124. rules={[{ required: true, type: "number", validator: amountValidator }]}
  125. >
  126. <Input
  127. placeholder={`${t("DepositPage.Montante")}(BRL): Mín. ${activeType.min_amount}`}
  128. type={"number"}
  129. maxLength={activeType.max_amount}
  130. />
  131. </Form.Item>
  132. <div className={"flex flex-col"}>
  133. <div className={"flex-1"}>
  134. <ul className="ul-box">
  135. {activeType.products.map((item, index) => (
  136. <li
  137. className={amount == item.amount ? "active" : ""}
  138. key={index}
  139. onClick={() => amountChange(item.amount)}
  140. >
  141. {!!item.badge && <span className="hot"></span>}
  142. <div className="amountContent">
  143. {/* <span className="iconfont icon-unit-brl"></span> */}
  144. <span className="iconfont">R$</span>
  145. <span> {item.amount}</span>
  146. </div>
  147. <span className="amountTips">
  148. {t("DepositPage.Oferecer")} 100%
  149. </span>
  150. </li>
  151. ))}
  152. </ul>
  153. </div>
  154. </div>
  155. </Form>
  156. </Box>
  157. </div>
  158. );
  159. };
  160. export default DepositData;